
var formNewlongs;
var formOrdenar;
var formFormatos;
var formBotones;
var formFiltros;
var divFiltros;
var divAyuda;

jQuery(document).ready(function()
    {
	// ------------------------------ //
	// ----------- General ---------- //
	// ------------------------------ //
	
	formNewlongs = jQuery("#form_proporciones");
	formOrdenar = jQuery("#form_ordenamiento");
	formFormatos = jQuery("#form_formatos");
	formBotones = jQuery("#form_botones");
	formFiltros = jQuery("#form_filtros");
	divFiltros = jQuery("#div_filtros");
	divAyuda = jQuery("#div_ayuda");

	// La vista por defecto es 'estimar'.
	establecerVista('estimar');
	
	// Cuando pongo el mouse encima de un formato, me muestra en que otras partes se encuentra el mismo y cuando lo cliqueo, queda marcado.
	jQuery(".formato_hl")
		.hover
			(
			function() {jQuery(".formato_hl[data-formatoId='"+jQuery(this).attr("data-formatoId")+"']").addClass("formato_hover");},
			function() {jQuery(".formato_hl[data-formatoId='"+jQuery(this).attr("data-formatoId")+"']").removeClass("formato_hover");}
			)
		.click(function()
			{
			if(jQuery(this).hasClass("formato_destacado"))
				{jQuery(".formato_hl[data-formatoId='"+jQuery(this).attr("data-formatoId")+"']").removeClass("formato_destacado");}
			else
				{jQuery(".formato_hl[data-formatoId='"+jQuery(this).attr("data-formatoId")+"']").addClass("formato_destacado");}
			});

	// Al cliquear el input de los formatos, no se deben marcar los mismos.
	jQuery(".formato_hl input").click(function(event)
		{
		event.stopPropagation();
		return true;
		});	

	
	// ------------------------------ //
	// ----------- Filtros ---------- //
	// ------------------------------ //

	// Inicializacion de los campos de fecha.
	jQuery(formFiltros).find("input.fecha").datepicker( {showAnim: "slideDown", dateFormat: "dd/mm/yy"} );

	jQuery(formFiltros).find("input[name='f-fecha1']").change( function()
		{changeCampoFecha("#form_filtros input[name='f-fecha1']", "#form_filtros input[name='f-fecha2']", 1);});
	jQuery(formFiltros).find("input[name='f-fecha2']").change( function()
		{changeCampoFecha("#form_filtros input[name='f-fecha1']", "#form_filtros input[name='f-fecha2']", 2);});
	
	// Al presionar el boton 'Buscar', busco la composicion de la demanda para el periodo dado.
	jQuery(formFiltros).find("button[name='buscar']").click(function()
		{
		// Muestro el cartel de espera.
		msjLoading("div_resultados", true);

		// Llamo al script del algoritmo evolutivo.
		jQuery.ajax({
					type: 'POST',
					url: 'svcs/proporciones-newlong.jsp',
					dataType: 'json',
					data: {'service': 'estimar',
						   'fecha1': jQuery(formFiltros).find("input[name='f-fecha1']").val(),
						   'fecha2': jQuery(formFiltros).find("input[name='f-fecha2']").val(),
						   'timestamp': timestamp()},
					success: function(data, code, xmlHttpRequest)
						{
						if(data.code == 0)
							{							
							// Limpio todos los valores.
							jQuery(formFormatos).find("input.composicion").val("0");
							jQuery(formNewlongs).find("input.bolsas").val("0");

							// Pongo los resultados en la tabla de proporciones.
							for(var formatoId in data.bolsas)
								{
								var bolsas = parseInt(data.bolsas[formatoId] * 30 / 1000, 10);
								jQuery(formFormatos).find("input[name='formato_"+formatoId+"']").val( Util.formatNumber(bolsas, ',', '.') );
								
								// Distribuyo la carga de las Newlong.
								Newlong_distribuirCarga(formatoId);
								}
							
							// Recalculo la carga de las Newlong.
							jQuery(formNewlongs).find("input.carga").each(function()
								{Newlong_actualizarCarga( jQuery(this).attr("data-newlongId") );});	
							}
						else
							{mostrarMsj("Error", data.msj);}

						// Saco el cartel de espera.
						msjLoading("div_resultados",false);
						},
					error: function(xmlHttpRequest, type)
						{
						// Saco el cartel de espera y muestro el error.
						msjLoading("div_resultados",false);
						mostrarMsj("Error","No se pudo establecer la conexión con el servidor: " + type + " " + xmlHttpRequest.status + " (" + xmlHttpRequest.statusText + ")");
						}
					});
		
		return false;
		});


	
	// ------------------------------ //
	// ----------- Botones ---------- //
	// ------------------------------ //

	// Al presionar los botones 'Balancear', 'Estimar' u 'Ordenar', se muestran los formularios correspondientes.
	jQuery(formBotones).find("button.vista").click(function()
		{
		establecerVista(jQuery(this).attr("name"));
		return false;
		});

	// Al presionar el botón 'Ayuda' se muestra una ventana emergente con una explicación.
	jQuery(formBotones).find("button[name='ayuda']").click(function()
		{
		var st = jQuery(window).scrollTop();
		jQuery(divAyuda).dialog('open');
		jQuery(window).scrollTop(st);
		return false;
		});
	
	// Los botones guardar envían los correspondientes formularios.
	jQuery(formBotones).find("button.guardar").click(function()
		{
		// Debo guardar la cantidad y las proporciones de los formatos.
		if(jQuery(this).attr("name") == 'guardar_balancear')
			{
			// Calculo las proporciones.
			jQuery(formNewlongs).find("input.carga").each(function()
				{
				var newlongId = jQuery(this).attr("data-newlongId");
				var total = Newlong_calcularBolsas(newlongId);
				
				jQuery(formNewlongs).find("input.bolsas[data-newlongId='"+newlongId+"']").each(function()
					{
					var formatoId = jQuery(this).attr("data-formatoId");
					var proporcion = Util.parseNumber(jQuery(this).val(), ',', '.') / total * 100;
					jQuery(formNewlongs).find("input.proporcion[data-newlongId='"+newlongId+"'][data-formatoId='"+formatoId+"']").val(proporcion);
					});
				});
			
			jQuery(formNewlongs).submit();
			}
			
		// Debo guardar el orden de los formatos.
		if(jQuery(this).attr("name") == 'guardar_ordenar')
			{
			// Por cada Newlong, genero la lista de sus formatos con sus respectivos órdenes.
			jQuery(formOrdenar).find("ul.formatos").each(function()
				{
				var ids = '';
				jQuery(this).find("li.formato").each(function(index)
					{
					if(ids.length > 0) ids += ",";
					ids += jQuery(this).attr("data-formatoId") + ":" + (index+1);
					});
			
				var newlongId = jQuery(this).attr("data-newlongId");
				jQuery(formOrdenar).find("input[name='formatos_"+newlongId+"']").val(ids);
				});

			jQuery(formOrdenar).submit();
			}
                if(jQuery(this).attr("name") == 'guardar_generar')
			{
                            jQuery(formNewlongs).find("input.carga").each(function()
				{
				var newlongId = jQuery(this).attr("data-newlongId");
				var total = Newlong_calcularBolsas(newlongId);

				jQuery(formNewlongs).find("input.bolsas[data-newlongId='"+newlongId+"']").each(function()
					{
					var formatoId = jQuery(this).attr("data-formatoId");
					var proporcion = Util.parseNumber(jQuery(this).val(), ',', '.') / total * 100;
					jQuery(formNewlongs).find("input.proporcion[data-newlongId='"+newlongId+"'][data-formatoId='"+formatoId+"']").val(proporcion);
					});
				});
                        jQuery("#form_proporciones input[name='accion']").val("generar");
			jQuery(formNewlongs).submit();
			
                      }
			
		return false;
		});
	
	
	// ---------------------------- //
	// ----------- Ayuda ---------- //
	// ---------------------------- //

	jQuery(divAyuda).find("button[name='cerrar_ayuda']").click(function()
		{
		jQuery("#div_ayuda").dialog('close');
		return false;
		});
	
	jQuery(divAyuda).dialog(
		{
        autoOpen: false,
		show: 'slide',
		hide: 'slide',
		width: 960,
        modal: true
		});



	// --------------------------------- //
	// ----------- Estimación ---------- //
	// --------------------------------- //
	 
	// Calculo las bolsas de todos los formatos
	jQuery(formFormatos).find("input.composicion").each(function()
		{Formato_actualizarBolsas( jQuery(this).attr("data-formatoId") );});

	// Al cambiar la composición, distributo la cantidad en las Newlongs.
	jQuery(formFormatos).find("input.composicion").keyup(function()
		{Newlong_distribuirCarga( jQuery(this).attr("data-formatoId") );});



	// ------------------------------- //
	// ----------- Balanceo ---------- //
	// ------------------------------- //
	 
	// Calculo la carga de todas las Newlong.
	jQuery(formNewlongs).find("input.carga").each(function()
		{Newlong_actualizarCarga( jQuery(this).attr("data-newlongId") );});

	// Cuando se cambia una cantidad de bolsas: 
	// - Se actualiza la carga de su Newlong.
	// - Se actualiza las bolsas de los formatos.
	jQuery(formNewlongs).find("input.bolsas").keyup(function()
		{
		Newlong_actualizarCarga( jQuery(this).attr("data-newlongId") );
		Formato_actualizarBolsas( jQuery(this).attr("data-formatoId") )
		});



	// ----------------------------------- //
	// ----------- Ordenamiento ---------- //
	// ----------------------------------- //
	
	jQuery(formOrdenar).find("ul.formatos").sortable();
    });



function establecerVista(vista)
	{
	// Oculto el botón que establece esta vista y muestro los demás.
	jQuery(formBotones).find("button.vista").show();
	jQuery(formBotones).find("button.vista[name='"+vista+"']").hide();
	
	// Muestro el botón correspondiente de guardar.
	jQuery(formBotones).find("button.guardar").hide();
	jQuery(formBotones).find("button.guardar[name='guardar_"+vista+"']").show();
	
	// Oculto/Muestro los demás elementos.
	if(vista == 'balancear')
		{
		jQuery(formFormatos).show();
		jQuery(formNewlongs).show();
		jQuery(formOrdenar).hide();
		jQuery(divFiltros).hide();
                jQuery(formBotones).find("button.guardar[name='guardar_generar']").show();
		}
	else if(vista == 'ordenar')
		{
		jQuery(formFormatos).hide();
		jQuery(formNewlongs).hide();
		jQuery(formOrdenar).show();
		jQuery(divFiltros).hide();
		}
	else // if (vista == 'estimar')
		{
		jQuery(formFormatos).show();
		jQuery(formNewlongs).hide();
		jQuery(formOrdenar).hide();
		jQuery(divFiltros).show();
		}
	}



function Newlong_calcularBolsas(newlongId)
	{
	var total = 0;
	jQuery(formNewlongs).find("input.bolsas[data-newlongId='"+newlongId+"']").each(function(index)
		{total += Util.parseNumber(jQuery(this).val(), ',', '.');});
	return total;
	}

function Newlong_calcularCarga(newlongId)
	{return Newlong_calcularBolsas(newlongId) / parseFloat(jQuery(formNewlongs).find("input[name='capacidad_"+newlongId+"']").val());}

function Newlong_actualizarCarga(newlongId)
	{
	var total = parseInt(100 * Newlong_calcularCarga(newlongId));
	jQuery(formNewlongs).find("input[name='carga_"+newlongId+"']").val(total + " %");
	}

function Newlong_calcularBolsasDeFormato(formatoId)
	{
	var total = 0;

	jQuery(formNewlongs).find("input.bolsas[data-formatoId='"+formatoId+"']").each(function(index)
		{total += Util.parseNumber(jQuery(this).val(), ',', '.');});

	return total;
	}

function Newlong_distribuirCarga(formatoId)
	{
	var bolsas = Util.parseNumber( jQuery(formFormatos).find("input.composicion[name='formato_"+formatoId+"']").val(), ",", ".");
	var cant = jQuery(formNewlongs).find("input.bolsas[data-formatoId='"+formatoId+"']").size();
	var total = Newlong_calcularBolsasDeFormato(formatoId);
	
	jQuery(formNewlongs).find("input.bolsas[data-formatoId='"+formatoId+"']").each(function(index)
		{
		var valor = (total>0)? bolsas*Util.parseNumber(jQuery(this).val(), ',', '.')/total : bolsas/cant;
		jQuery(this).val( Util.formatNumber(valor, ',', '.') );
		Newlong_actualizarCarga(jQuery(this).attr("data-newlongId"));
		});
	}

function Formato_actualizarBolsas(formatoId)
	{
	jQuery(formFormatos).find("input[name='formato_"+formatoId+"']").val(
		Util.formatNumber( Newlong_calcularBolsasDeFormato(formatoId), ',', '.' )
		);
	}

